home *** CD-ROM | disk | FTP | other *** search
/ Apple Reference & Presen…rary 6 (Reseller Edition) / Apple Ref. & Pres. Lib.v6.0.toast / mac / 2-Graphics / Apple Graphics Source / Apple Graphics Source 3.0 / stack.txt < prev   
Text File  |  1990-08-07  |  31KB  |  926 lines

  1. -- stack: in.0
  2. -- format: 8 (HyperCard 1)
  3. -- flags: 0x9000 (can't modify)
  4. -- protect password hash: 0
  5. -- maximum user level: 5 (scripting)
  6. -- window: Rect(x1=0, y1=0, x2=0, y2=0)
  7. -- screen: Rect(x1=0, y1=0, x2=0, y2=0)
  8. -- card dimensions: w=0 h=0
  9. -- scroll: x=0 y=0
  10. -- background count: 3
  11. -- first background id: 3618
  12. -- card count: 621
  13. -- first card id: 3356
  14. -- list block id: 2406
  15. -- print block id: 0
  16. -- font table block id: 0
  17. -- style table block id: 0
  18. -- free block count: 0
  19. -- free size: 0 bytes
  20. -- total size: 818688 bytes
  21. -- stack block size: 31232 bytes
  22. -- created by hypercard version: 0x01258000
  23. -- compacted by hypercard version: 0x01258000
  24. -- modified by hypercard version: 0x01258000
  25. -- opened by hypercard version: 0x01258000
  26. -- patterns[0]: 0x0000000000000000
  27. -- patterns[1]: 0x8000000008000000
  28. -- patterns[2]: 0x8800220088002200
  29. -- patterns[3]: 0x8888222288882222
  30. -- patterns[4]: 0x88AA22AA88AA22AA
  31. -- patterns[5]: 0xCCAA33AACCAA33AA
  32. -- patterns[6]: 0xEEAABBAAEEAABBAA
  33. -- patterns[7]: 0xEEBBBBEEEEBBBBEE
  34. -- patterns[8]: 0xFFBBFFEEFFBBFFEE
  35. -- patterns[9]: 0xFFBBFFFFFFBBFFFF
  36. -- patterns[10]: 0x8010022001084004
  37. -- patterns[11]: 0xFFFFFFFFFFFFFFFF
  38. -- patterns[12]: 0x8822882288228822
  39. -- patterns[13]: 0x1122448811224488
  40. -- patterns[14]: 0xC4800C6843023026
  41. -- patterns[15]: 0xB130031BD8C00C8D
  42. -- patterns[16]: 0xAA00AA00AA00AA00
  43. -- patterns[17]: 0x8822552288225522
  44. -- patterns[18]: 0x8855225588552255
  45. -- patterns[19]: 0x77DD77DD77DD77DD
  46. -- patterns[20]: 0x8000000000000000
  47. -- patterns[21]: 0xAA55AA55AA55AA55
  48. -- patterns[22]: 0x038448300C020101
  49. -- patterns[23]: 0x8244394482010101
  50. -- patterns[24]: 0x8814224188412214
  51. -- patterns[25]: 0x8080413E080814E3
  52. -- patterns[26]: 0x22048C7422179810
  53. -- patterns[27]: 0xBE808808EB088880
  54. -- patterns[28]: 0x25C8328964244C92
  55. -- patterns[29]: 0xA29C41BE2AC914EB
  56. -- patterns[30]: 0x40A00000040A0000
  57. -- patterns[31]: 0x8040200002040800
  58. -- patterns[32]: 0xAA00800088008000
  59. -- patterns[33]: 0xFF80808080808080
  60. -- patterns[34]: 0x081C22C180010204
  61. -- patterns[35]: 0xFF808080FF080808
  62. -- patterns[36]: 0xF87422478F172271
  63. -- patterns[37]: 0xBF00BFBFB0B0B0B0
  64. -- patterns[38]: 0xFF7FBE5DA2418000
  65. -- patterns[39]: 0xFAF5FAF5A050A050
  66. -- checksum: 0x0
  67. ----- HyperTalk script -----
  68. --‚Ä¢‚Ä¢ SYSTEM MESSAGES
  69.  
  70. on openStack
  71.   global firstTimeAGS,artManagement,findParams,lastFindTerms
  72.   if the version < 1.2 then
  73.     dialogIt "Sorry. You need HyperCard version 1.2 or greater." && "You are using version" & the version & "."
  74.   end if
  75.   if firstTimeAGS is empty then
  76.     -- This is the first time you have opened the stack in this
  77.     -- HyperCard session.
  78.     put false into artManagement
  79.   end if
  80.   show menubar
  81.   put empty into findParams
  82.   put empty into lastFindTerms
  83.   pass openStack
  84. end openStack
  85.  
  86. on closeStack
  87.   global artManagement,taggedList
  88.   saveChanges true,taggedList,true
  89.   if artManagement then
  90.     set cursor to busy
  91.     lock screen
  92.     set lockMessages to true
  93.     set lockRecent to true
  94.     go bg "the collection"
  95.     send "adminElements false" to this bg
  96.   end if
  97.   pass closeStack
  98. end closeStack
  99.  
  100. on arrowKey whichKey
  101.   set textArrows to not (selectedChunk() is empty)
  102.   pass arrowkey
  103. end arrowKey
  104.  
  105. on domenu menu                       --// Added by Medior, Inc. 8/8/90
  106.   global RPStackName
  107.   if menu is in "Home,Quit HyperCard" and RPStackName is not empty then
  108.     set cursor to watch
  109.     put RPStackName into shortname
  110.     repeat until offset(":",shortname) = 0
  111.       delete char 1 to offset(":",shortname) of shortname
  112.     end repeat
  113.     delete last char of shortname
  114.     answer "This will return to "&shortname&"." with "Cancel" or "OK"
  115.     if it is "Cancel" then exit domenu
  116.     set cursor to watch
  117.     lock screen
  118.     go RPStackName
  119.     unlock screen with dissolve
  120.     exit domenu
  121.   else pass doMenu
  122. end domenu
  123. --‚Ä¢‚Ä¢ MESSAGE HANDLERS
  124.  
  125. on goStack whichStack
  126.   if the hilite of the target then exit goStack
  127.   set lockMessages to true
  128.   set lockRecent to true
  129.   lock screen
  130.   go stack "Apple Graphics - " & whichStack
  131.   answer "Check the stack name to see if its changed."
  132.   go bg "the collection"
  133.   unlock screen with visual effect dissolve
  134.   openBackground
  135.   openCard
  136. end goStack
  137.  
  138. on admin
  139.   global artManagement
  140.   put true into artManagement
  141.   send "adminElements true" to this bg
  142.   if the cantModify of this stack then
  143.     dialogIt "To use the developer buttons in the background" && "The Collection, move this stack to an unlocked volume."
  144.   end if
  145. end admin
  146.  
  147. on closeAdmin
  148.   global artManagement
  149.   put false into artManagement
  150.   send "adminElements false" to this bg
  151. end closeAdmin
  152.  
  153. on selectLine whichLine,whichFld
  154.   --whichLine is a wholeNumber and whichFld is the short name of a fld.
  155.   if whichLine = empty OR whichFld = empty then exit selectLine
  156.   put line whichLine of fld whichFld into theText
  157.   if theText is not empty then
  158.     put (number of chars of line 1 to whichLine of fld whichFld) + 1 into endChar
  159.     select char (endChar - length (theText)) to endChar of fld whichFld
  160.     wait 5
  161.   end if
  162. end selectLine
  163.  
  164. on stopBtnStatus boolean
  165.   set visible of fld "status" to boolean
  166. end stopBtnStatus
  167.  
  168. on showProgress whichText, whichPercent
  169.   put whichText && "(" & whichPercent & "% Complete" & ")"
  170. end showProgress
  171.  
  172. on hideProgress
  173.   put empty
  174.   hide msg
  175. end hideProgress
  176.  
  177. on toggleLockScreen
  178.   unlock screen
  179.   lock screen
  180.   unlock screen
  181. end toggleLockScreen
  182.  
  183. on showListName
  184.   global activeListName
  185.   if the short name of this bg is not "the collection" then
  186.     go bg "the collection"
  187.   end if
  188.   set the name of bg btn id 353 to "List Name:" && activeListName
  189. end showListName
  190.  
  191. on goListStack thisCard
  192.   --Takes you to the list stack, or returns "no" if this is unsuccesful.
  193.   --thisCard, the name of the card in the list stack
  194.   --you want to go to. is optional.
  195.   global listStack
  196.   lock screen
  197.   set lockMessages to true
  198.   set lockRecent to true
  199.   go stack listStack
  200.   if the short name of this stack <> listStack then exit to hypercard
  201.   if cantModify of this stack then
  202.     dialogIt "The stack" && quote & listStack & quote && "is locked." && "You can't save changes to your lists until you unlock" && "the stack" && quote & listStack & quote & "."
  203.     return "no"
  204.   end if
  205.   if thisCard is not empty then go cd thisCard
  206.   if the result is not empty then
  207.     --this card wasn't found
  208.     dialogIt "The card" && thisCard && "was not found in" && "the stack" && listStack && "."
  209.     return "no"
  210.   end if
  211. end goListStack
  212.  
  213. --LIST scripts
  214.  
  215. on deleteListEntries whichField
  216.   set cursor to arrow
  217.   lock screen
  218.   send "deleteEntryVisible true" to this cd
  219.   put the rect of the name of whichField into listRect
  220.   put listRect into validArea
  221.   subtract 17 from item 3 of validArea
  222.   --17 is the width of the scroll bar
  223.   unlock screen with barn door open
  224.   repeat
  225.     wait while the mouse is up
  226.     --the user clicked the mouse
  227.     put the clickLoc into userLoc
  228.     if userLoc is within the rect of (the name of whichField) AND userLoc is not within validArea then
  229.       --user clicked on the scroll bar
  230.       next repeat
  231.     end if
  232.     if userLoc is NOT within validArea OR (the name of whichField) = empty then exit repeat
  233.     put clickLine(the name of whichField) into whatLine
  234.     if line whatLine of (the value of whichField) = empty then
  235.       exit repeat
  236.     end if
  237.     if isEvenNumber(whatLine) then subtract 1 from whatLine
  238.     repeat 2 times
  239.       send "selectLine whatLine, the short name of whichField" to this cd
  240.       do "delete line whatLine of" && the name of whichField
  241.     end repeat
  242.     reNumberSequence whatLine,whichField
  243.     set cursor to arrow
  244.   end repeat
  245.   send "deleteEntryVisible false" to this cd
  246. end deleteListEntries
  247.  
  248. on reNumberSequence N,whichField
  249.   --N is the line number of the first line that needs a new entry number
  250.   global entryPrefix, entrySuffix
  251.   put the value of whichField into thisField
  252.   repeat until line N of thisField = empty
  253.     set cursor to watch
  254.     delete char 1 to the number of chars in entryPrefix of line N of thisField
  255.     put (N / 2 + .5) into newNumber
  256.     put beginEntryLine(newNumber) into beginLine
  257.     put beginLine & newNumber & entrySuffix before line N of thisField
  258.     do "put thisField into" && the name of whichField
  259.     add 2 to N
  260.   end repeat
  261. end reNumberSequence
  262.  
  263. on findEntry whichLine,findThis,whichField
  264.   global listScroll,entryPrefix
  265.   if findThis is empty then exit findEntry
  266.   if (whichLine/2) = trunc(whichLine/2) then
  267.     -- user selected a file name
  268.     put line whichLine of the value of whichField into uniqueNumber
  269.   else
  270.     -- user selected a name
  271.     put line (whichLine+1) of the value of whichField into uniqueNumber
  272.   end if
  273.   -- get rid of extra characters
  274.   delete char 1 to (the number of chars in entryPrefix) of uniqueNumber
  275.   if the short name of this bg is not "the collection" then
  276.     go bg "the collection"
  277.   end if
  278.   find whole uniqueNumber in fld "file name field"
  279.   if the foundText is empty then
  280.     dialogIt "In this stack, there isn‚Äôt a graphic with the file name" && quote & uniqueNumber & quote & "."
  281.     exit findEntry
  282.   end if
  283.   set scroll of fld "list" to listScroll
  284.   unlock screen with visual effect wipe left
  285. end findEntry
  286.  
  287. on saveChanges dialogNeeded,toBeSaved,savingOpenList
  288.   global activeListName,changesToList,taggedList
  289.   --dialogNeeded = true if a dialog is needed asking the user
  290.   --if they want to save changes.
  291.   --savingOpenList = false if you are saving a list that is not
  292.   --the active list (as you can do on the Focus card).
  293.   -- Return true if the save was completed and succesfully.
  294.   -- Otherwise, it return false.
  295.   put the long name of this cd into afterSaveGoHere
  296.   if savingOpenList then
  297.     if changesToList is not true then return false
  298.     --the exit was made because a save was unnecessary.
  299.     if dialogNeeded then
  300.       -- The user needs to be asked if they want to save changes.
  301.       dialogIt "Save changes to the list " & quote & activeListName & quote & "?", "No,Yes"
  302.       if the result is "No" then
  303.         -- The user doesn't want to save the current list.
  304.         put "Untitled" into activeListName
  305.         put false into changesToList
  306.         put empty into taggedList
  307.         exit saveChanges
  308.       end if
  309.     end if
  310.   end if
  311.   if activeListName is "untitled" OR activeListName is empty then
  312.     --Get a name for the list
  313.     checkListName "Save the list as (15 letters or less):"
  314.     if the result is not empty then return false
  315.     --you are at the new list card.
  316.   end if
  317.   goListStack activeListName
  318.   if the result is "no" then
  319.     go afterSaveGoHere
  320.     return false
  321.   end if
  322.   set cursor to busy
  323.   put toBeSaved into fld "tagged list"
  324.   go afterSaveGoHere
  325.   set cursor to busy
  326.   if savingOpenList then
  327.     put false into changesToList
  328.     showListName
  329.   end if
  330.   return true
  331. end saveChanges
  332.  
  333. on checkListName prompt,default
  334.   -- If list entered is invalid, return a non-empty value.
  335.   global activeListName
  336.   if default = "untitled" then put empty into default
  337.   ask prompt with default
  338.   put it into whichName
  339.   if whichName = empty then return "1"
  340.   else if not validListName(whichName) then
  341.     checkListName prompt,default
  342.     exit checkListName
  343.   end if
  344.   -- You're in the list stack.
  345.   put whichName into activeListName
  346.   go last cd of this bg
  347.   doMenu "new card"
  348.   set the name of this cd to activeListName
  349. end checkListName
  350.  
  351. on dialogIt whichText, whichButtons, whichFont, whichIcon
  352.   if whichButtons is empty then put "OK" into whichButtons
  353.   if whichIcon is empty then put "0" into whichIcon
  354.   if whichFont is empty then put "chicago" into whichFont
  355.   get dialog(whichText,whichButtons,whichIcon,whichFont,plain,12)
  356.   return it
  357. end dialogIt
  358.  
  359. --‚Ä¢ THESE SCRIPTS USE THE POINTERS TO FIND SPECIFIC CARDS.
  360.  
  361. on findAGS dialogPhrase,indexField,pointerField,writeField,goForward
  362.   global findParams,lastFindTerms
  363.   if the number of lines in lastFindTerms > 1 then
  364.     put getCardIdIntersection(lastFindTerms,pointerField,writeField) into validFileNames
  365.   else
  366.     put getValidFileNames(lastFindTerms,pointerField,writeField) into validFileNames
  367.   end if
  368.   put binaryInsert(bg fld "file name field",validFileNames) into thisItem
  369.   -- thisItem is the item number in validFileNames of the NEXT valid
  370.   -- file name in the stack.
  371.   put allFoundPrefix(lastFindTerms,dialogPhrase) into allFound
  372.   put noneFoundPrefix(lastFindTerms,dialogPhrase) into noneFound
  373.   if thisItem = 0 then
  374.     dialogIt noneFound
  375.     exit findAGS
  376.   end if
  377.   if not goForward then
  378.     put advanceItem(thisItem,goForward,validFileNames) into thisItem
  379.   end if
  380.   lock screen
  381.   repeat with N = (the number of items in validFileNames) down to 1
  382.     if the mouseClick then exit repeat
  383.     put getCardId(item thisItem of validFileNames) into thisCardId
  384.     if thisCardId is empty then exit repeat
  385.     go cd id thisCardId
  386.     if the result is not empty then next repeat
  387.     if the number of lines in lastFindTerms = 1 then
  388.       put getLine(lastFindTerms,bg fld indexField) into thisLine
  389.       if thisLine is empty then next repeat
  390.     end if
  391.     -- There is an exact match.
  392.     updateStatus N
  393.     stopBtnStatus true
  394.     if goForward then unlock screen with visual effect wipe left
  395.     else unlock screen with visual effect wipe right
  396.     if the number of lines in lastFindTerms = 1 then
  397.       selectLine thisLine,indexField
  398.     end if
  399.     if N <> the number of items in validFileNames then
  400.       -- This is not the first time through
  401.       if shallWeStop() then exit repeat
  402.     end if
  403.     lock screen
  404.     put empty into fld "Status"
  405.     put advanceItem(thisItem,goForward,validFileNames) into thisItem
  406.     if N = 1 then
  407.       -- You've gone to all of the appropriate cards, so stop.
  408.       wait 30
  409.       stopBtnStatus false
  410.       unlock screen
  411.       wait 40
  412.       if not the mouseClick then dialogIt allFound
  413.     end if
  414.   end repeat
  415.   put the params into findParams
  416.   stopBtnStatus false
  417.   put empty into bg fld "status"
  418. end findAGS
  419.  
  420. on updateStatus cardsLeft
  421.   if cardsLeft = 1 then put "occurrence" into phrase
  422.   else put "occurrences" into phrase
  423.   put cardsLeft && phrase && "left. Click and Hold to Stop." into fld "status"
  424. end updateStatus
  425.  
  426. --‚Ä¢ THESE SCRIPTS HANDLE THE POINTERS.
  427.  
  428. on buildPointers indexField,writeField,pointerField
  429.   put readIndex(writeField) into thisIndex
  430.   put the number of lines in thisIndex into numberOfEntries
  431.   set cursor to watch
  432.   lock screen
  433.   set lockMessages to true
  434.   put "Building pointers for" && writeField into status
  435.   repeat with N = 1 to numberOfEntries
  436.     showProgress status,round(N/(numberOfEntries)*100)
  437.     put line N of thisIndex into whichText
  438.     if whichText = empty OR whichText = space then next repeat
  439.     go cd 1 of bg "the collection"
  440.     put empty into entries
  441.     put empty into firstCard
  442.     put empty into currentCard
  443.     repeat
  444.       find whole whichText in fld indexField
  445.       if the foundChunk is empty then
  446.         --The text wasn't found in the specified field.
  447.         exit repeat
  448.       end if
  449.       put word 2 of the foundLine into thisLine
  450.       if whichText <> line thisLine of fld indexField then
  451.         --There was a find, but not an exact match, so look again.
  452.         next repeat
  453.       end if
  454.       if firstCard = empty then
  455.         put the short id of this cd into firstCard
  456.       else put the short id of this cd into currentCard
  457.       if firstCard = currentCard then
  458.         --you've been to all of the valid cards.
  459.         exit repeat
  460.       end if
  461.       --If it got this far, then there was an exact match.
  462.       put bg fld "file name field" & "," after entries
  463.     end repeat
  464.     put the number of chars in whichText into fldNumber
  465.     put last char of fldNumber into fldNumber
  466.     if last char of entries is "," then delete last char of entries
  467.     writePointer entries,N,pointerField && fldNumber
  468.   end repeat
  469.   hideProgress
  470. end buildPointers
  471.  
  472. on writePointer newPointer,lineNumber,fldName
  473.   put newPointer into line lineNumber of cd fld fldName of cd "Index storage"
  474. end writePointer
  475.  
  476. --‚Ä¢‚Ä¢ END AGS ONLY
  477.  
  478. --‚Ä¢‚Ä¢ FUNCTIONS
  479.  
  480. function diskSpaceAvailable
  481. -- Return true if the disk space available is greater than the
  482. -- limit given. Otherwise, return false.
  483. if the diskSpace > 5000 then return true
  484. put the long name of this stack into stackName
  485. delete char 1 to 7 of stackName
  486. delete last char of stackName
  487. put volumeName(stackName) into diskName
  488. put round(the diskSpace / 1000) into spaceAvailable
  489. dialogIt "There is" && spaceAvailable & "K of disk space" && "available on" && quote & diskName & quote & ". Since this may" && "not be enough disk space to continue, the current task has been" && "stopped. You should move this stack to a disk with more" && "space available before continuing this task."
  490. return false
  491. end diskSpaceAvailable
  492.  
  493. function isWithin thisText, container
  494. -- Return true of thisText is a complete line in the given container.
  495. if line 1 of container = thisText OR container contains return & thisText & return OR thisText = last line of container then return true
  496. return false
  497. end isWithin
  498.  
  499. function clickLine whichField
  500. -- Return the number of the line clicked.
  501. -- First, determine how many lines are hidden above
  502. if the style of whichField is "scrolling" then
  503.   put the scroll of whichField into theScroll
  504. else put 0 into theScroll
  505. put (theScroll / textHeight of whichField) into linesAbove
  506. -- add that number to the relative position clicked
  507. return round(linesAbove + lineClicked(whichField))
  508. end clickLine
  509.  
  510. function lineClicked whichField
  511. return ((the mouseV - item 2 of the rect of whichField - 4) div the textheight of whichField) + 1
  512. end lineClicked
  513.  
  514. function beginEntryLine entryNumber
  515. if entryNumber < 10 then return space & space
  516. if entryNumber < 100 then return space
  517. if entryNumber < 1000 then return empty
  518. end beginEntryLine
  519.  
  520. function isEvenNumber whatString
  521. --returns true if the given string is an even number.
  522. if not positiveWholeNumber(whatString) then return false
  523. if whatString mod 2 = 0 then return true
  524. return false
  525. end isEvenNumber
  526.  
  527. function linesVisible whichFld
  528. --returns the number of lines that are visible in a field.
  529. return round(height of whichFld/the textHeight of whichFld)
  530. end linesVisible
  531.  
  532. function readIndex writeField
  533. return cd fld writeField of cd "Index storage"
  534. end readIndex
  535.  
  536. function getLine whichText,container
  537. --Where whichText is any text string.
  538. --Returns the line number of the given text in the given container.
  539. --Returns empty if an entire line in the container does not equal
  540. --whichText.
  541. --Note that OFFSET won't work because you're looking for
  542. --an entire line, not just a subset.
  543. if whichText = line 1 of container then return 1
  544. put offset(return & whichText & return,container) into theChars
  545. if theChars <> 0 then
  546.   return (the number of lines in char 1 to theChars of container) + 1
  547. end if
  548. if whichText = last line of container then
  549.   return (the number of lines in container)
  550. end if
  551. return empty
  552. end getLine
  553.  
  554. function listDialog thelist,delimit,text,selectMode,theButtons,dlogNo
  555. global ListSelectExit
  556. --ListSelectExit is the name of the button the user clicked to leave
  557. --the dialog box.
  558. if delimit is 13 then put return into delimit
  559. get ListSelect(selectMode,theList,text,theButtons,delimit,dlogNo)
  560. return it
  561. end listDialog
  562.  
  563. function sortContainer whichContainer
  564. --returns the given container sorted alphabetically.
  565. put alphaSort(whichContainer) into it
  566. return it
  567. end sortContainer
  568.  
  569. function substitute originalChar, newChar, whichContainer
  570. --returns the given container with the given existing character
  571. --substituted in all cases for the given new character.
  572. repeat
  573.   put offset(originalChar,whichContainer) into whichChar
  574.   if whichChar = 0 then exit repeat
  575.   put newChar into char whichChar of whichContainer
  576. end repeat
  577. return whichContainer
  578. end substitute
  579.  
  580. function validListName whichName
  581. if whichName is empty then return false
  582. if whichName is "Untitled" then
  583.   answer "List can't be named Untitled."
  584.   return false
  585. end if
  586. if whichName is "id" then
  587.   answer "Lists can't be named ID."
  588.   return false
  589. end if
  590. if the length of whichName > 15 then
  591.   answer "List names cannot have more than 15 letters."
  592.   return false
  593. end if
  594. if nonNegativeNumber(whichName) then
  595.   dialogIt "List names must contain at least one letter." && "The list name" && quote & whichName & quote && "is invalid."
  596.   return false
  597. end if
  598. goListStack
  599. if the result is "no" then
  600.   pop cd
  601.   exit to hypercard
  602. end if
  603. go bg "lists"
  604. repeat with i = 1 to (the number of cds in this bg)
  605.   if the short name of this cd = whichName then
  606.     dialogIt "There is already a list named" &"e& whichName "e& ". Please use a different name."
  607.     return false
  608.   end if
  609.   go next cd of this bg
  610. end repeat
  611. return true
  612. end validListName
  613.  
  614. function positiveWholeNumber whatString
  615. -- If whatString is a positive whole number, returns true.
  616. -- Otherwise, returns false.
  617. if not containsANumber(whatString) then return false
  618. repeat with i = 1 to the length of whatString
  619.   if "1234567890" contains char i of whatString then next repeat
  620.   else return false
  621. end repeat
  622. -- The final test
  623. if whatString > 0 then return true
  624. else return false
  625. end positiveWholeNumber
  626.  
  627. function nonNegativeNumber whatString
  628. --returns true if the given string is a non-negative number.
  629. if containsANumber(whatString) = false then return false
  630. repeat with i = 1 to the length of whatString
  631.   if ".1234567890" contains char i of whatString then next repeat else
  632.   -- if it makes it here, there is an invalid character,
  633.   -- so exit now.
  634.   return false
  635. end if
  636. end repeat
  637. return true
  638. end nonNegativeNumber
  639.  
  640. function containsANumber whatString
  641. --returns true if at least one of the characters in the
  642. --string is a number. Otherwise, returns false
  643. repeat with i = 1 to the length of whatString
  644.   if "1234567890" contains char i of whatString then
  645.     --there is at least one number, so go to the next test.
  646.     exit repeat
  647.   else if i = the length of whatString then
  648.     --you've gone through all characters & there aren't any numbers.
  649.     return false
  650.   end if
  651. end repeat
  652. return true
  653. end containsANumber
  654.  
  655. function getShortName longName
  656. -- Given the path to a file, return the name of the file.
  657. repeat
  658.   if longName contains ":" then
  659.     put offset (":",longName) into thisChar
  660.     delete char 1 to thisChar of longName
  661.   else exit repeat
  662. end repeat
  663. return longName
  664. end getShortName
  665.  
  666. function getPath longName
  667. -- Given the full path to a file, return
  668. -- the path to the file minus the name of the file.
  669. repeat
  670.   if last char of longName <> ":" then delete last char of longName
  671.   else exit repeat
  672. end repeat
  673. return longName
  674. end getPath
  675.  
  676. function volumeName pathName
  677. -- Given the full path to a file, return
  678. -- the name of the volume (i.e., the disk name, or top directory).
  679. put offset(":",pathName) into theChars
  680. return char 1 to (theChars - 1) of pathName
  681. end volumeName
  682.  
  683. --‚Ä¢‚Ä¢ FUNCTIONS (AGS ONLY)
  684.  
  685. function allFoundPrefix whichText,dialogPhrase
  686. if the number of lines in whichText = 1 then
  687.   return "You‚Äôve seen all of the graphics" && dialogPhrase && quote & whichText & quote & "."
  688. else
  689.   return "You've seen all of the graphics with all of the selected items."
  690. end if
  691. end allFoundPrefix
  692.  
  693. function noneFoundPrefix whichText,dialogPhrase
  694. if the number of lines in whichText = 1 then
  695.   return "There aren‚Äôt any graphics" && dialogPhrase && quote & whichText & quote & "."
  696. else
  697.   return "There aren‚Äôt any graphics that have all of the selected items."
  698. end if
  699. end noneFoundPrefix
  700.  
  701. function shallWeStop
  702. -- Pause at each card for a given amount of time.
  703. global ticksToWait
  704. put (the ticks + ticksToWait) into stopTicks
  705. repeat until stopTicks < (the ticks)
  706.   if the mouse is down then return true
  707. end repeat
  708. return false
  709. end shallWeStop
  710.  
  711. function advanceItem thisItem,goForward,validFileNames
  712. put thisItem into testThis
  713. if goForward then
  714.   add 1 to thisItem
  715.   if thisItem > the number of items in validFileNames then
  716.     put 1 into thisItem
  717.   end if
  718. else
  719.   subtract 1 from thisItem
  720.   if thisItem = 0 then
  721.     put the number of items in validFileNames into thisItem
  722.   end if
  723. end if
  724. return thisItem
  725. end advanceItem
  726.  
  727. function getCardIdIntersection source,pointerField,writeField
  728. -- Return the card ids of all cards that meet the criteria.
  729. -- Source is a return-delimited list that determines the criteria.
  730. put getLeastItems(source,pointerField,writeField) into whichLine
  731. if whichLine is empty then return whichLine
  732. put line whichLine of source into occursLeast
  733. -- occursLeast is the text that occurs the least times in the stack.
  734. put getFileNames(occursLeast,source,writeField,pointerField) into cardIds
  735. return cardIds
  736. end getCardIdIntersection
  737.  
  738. function getLeastItems object,pointerField,writeField
  739. -- Return the line number of the object that has the fewest
  740. -- occurrences in the stack.
  741. -- Object is a return-delimited list of terms (such as keywords, etc.)
  742. put empty into lowest
  743. put empty into leastItems
  744. repeat with N = 1 to the number of lines in object
  745.   set cursor to busy
  746.   put line N of object into whichText
  747.   get numberOfOccurrences(whichText,pointerField,writeField)
  748.   if lowest = empty OR it < lowest then
  749.     put it into lowest
  750.     put N into leastItems
  751.   end if
  752. end repeat
  753. return leastItems
  754. end getLeastItems
  755.  
  756. function getFileNames whichText,source,writeField,pointerField
  757. -- Given a text string, its index, and pointer field that
  758. -- has the least occurrences in the stack, return a formatted list of
  759. -- descriptions and file names that meet the criteria.
  760. put getValidFileNames(whichText,pointerField,writeField) into subset
  761. repeat with N = 1 to the number of lines in source
  762.   set cursor to busy
  763.   put line N of source into whichText
  764.   put getValidFileNames(whichText,pointerField,writeField) into superSet
  765.   put getIntersection(subset,superSet) into intersection
  766.   if intersection is empty then
  767.     put empty into subset
  768.     exit repeat
  769.   else put intersection into subset
  770. end repeat
  771. return subset
  772. end getFileNames
  773.  
  774. function getCardId fileName
  775. -- Given a file name, return its card id.
  776. put cd fld "file name index" of cd "Index storage" into theIndex
  777. put getFileNameLine(fileName,theIndex) into whichLine
  778. if whichLine is empty then
  779.   dialogIt "The file name" && fileName && " is not part of the" && "File Name Index. You probably need to build the File Name Index."
  780.   return empty
  781. end if
  782. return item 2 of line whichLine of theIndex
  783. end getCardId
  784.  
  785. function itemNumber textString,theContainer
  786. -- Return the item number of the text string in the given container
  787. if item 1 of theContainer = textString then return 1
  788. else get offset("," & textString & ",",theContainer)
  789. if it <> 0 then
  790.   get the number of items in char 1 to it of theContainer
  791.   return it+1
  792. end if
  793. if textString = last item of theContainer then
  794.   return the number of items in theContainer
  795. end if
  796. return 0
  797. end itemNumber
  798.  
  799. function binaryInsert theItem,theContainer
  800. set cursor to watch
  801. -- a few quick tests up front
  802. if theContainer is empty then return 0
  803. -- if theItem is outside the bounds of the container then return 1
  804. if theItem > last item of theContainer OR theItem < item 1 of theContainer then return 1
  805. -- if theItem exists in the container, then return its item number
  806. if isWithinItems(theItem,theContainer) then
  807.   get itemNumber(theItem,theContainer)
  808.   return it
  809. end if
  810. -- begin binary insert
  811. put the number of items of theContainer into N
  812. put 1 into S
  813. repeat
  814.   put (N-S) div 2 into median
  815.   put (S + median) into keyN
  816.   if theItem < item keyN of theContainer then
  817.     if median = 0 then
  818.       put theItem & return before item keyN of theContainer
  819.       exit repeat
  820.     else
  821.       put keyN into N
  822.       next repeat
  823.     end if
  824.   else
  825.     if median = 0 then
  826.       put return & theItem after item keyN of theContainer
  827.       exit repeat
  828.     else
  829.       put keyN into S
  830.       next repeat
  831.     end if
  832.   end if
  833. end repeat
  834. put the number of items in line 1 of theContainer into outcome
  835. if item outcome of theContainer = theItem then return outcome
  836. else return (outcome+1)
  837. end binaryInsert
  838.  
  839. function getValidFileNames whichText,pointerField,writeField
  840. -- Return the contents of the appropriate line in the appropriate
  841. -- pointer field.
  842. put nameOfPointerField(whichText,pointerField) into pointerField
  843. put getLine(whichText,readIndex(writeField)) into whichLine
  844. return line whichLine of cd fld pointerField of cd "Index storage"
  845. end getValidFileNames
  846.  
  847. function nameOfPointerField whichText,pointerField
  848. -- Return the full name of the pointer field.
  849. put the length of whichText into lengthOfWhichText
  850. put pointerField && last char of lengthOfWhichText into pointerField
  851. return pointerField
  852. end nameOfPointerField
  853.  
  854. function numberOfOccurrences whichText,pointerField,writeField
  855. get getValidFileNames(whichText,pointerField,writeField)
  856. return the number of items in it
  857. end numberOfOccurrences
  858.  
  859. function getFileNameLine whichFileName,container
  860. -- Given a file name, this function return its line number in the
  861. -- File Name Index.
  862. if whichFileName = item 1 of line 1 of container then return 1
  863. put offset(return & whichFileName & ",",container) into theChars
  864. if theChars <> 0 then
  865.   return (the number of lines in char 1 to theChars of container) + 1
  866. end if
  867. if whichFileName = item 1 of last line of container then
  868.   return (the number of lines in container)
  869. end if
  870. return empty
  871. end getFileNameLine
  872.  
  873. function getFileNameCont whichFileName,theIndex
  874. --Given a file name, this function return the contents of its
  875. --entire line in the file name index.
  876. put getIdLine(whichFileName,theIndex) into thisLine
  877. return line thisLine of theIndex
  878. end getFileNameCont
  879.  
  880. function getIntersection firstList,secondList
  881. -- Given two item-delimited lists, return their intersection.
  882. if firstList = secondLIst then return firstList
  883. -- First, figure out which list is shorter.
  884. if the number of items in firstList < the number of items in secondList OR the number of items in firstList = the number of items in secondList
  885. then
  886. put firstList into subset
  887. put secondList into superSet
  888. else
  889.   put secondList into subset
  890.   put firstList into superSet
  891. end if
  892. put empty into intersection
  893. repeat with N = 1 to the number of items in subset
  894.   set cursor to busy
  895.   if isWithinItems(item N of subset,superset) then
  896.     put item N of subset into item (the number of items in intersection + 1) of intersection
  897.   end if
  898. end repeat
  899. return intersection
  900. end getIntersection
  901.  
  902. function isWithinItems thisItem,container
  903. --returns true of thisItem is a complete item in the given container.
  904. if item 1 of container = thisItem OR container contains "," & thisItem & "," OR thisItem = last item of container then return true
  905. return false
  906. end isWithinItems
  907.  
  908. --‚Ä¢‚Ä¢ END AGS ONLY
  909.  
  910. COPYRIGHT NOTICES
  911. AlphaSort, ¬© Jay Hodgdon, 1989
  912. Dialog, ¬© Gary Bond, 1989
  913. BigPop, ¬© Jay Hodgdon, 1989
  914. DisPict, ¬© Apple Computer, 1988-1990
  915. FIleName, ¬© Steve Maller, 1989
  916. FolderName, ¬© Eric Carlson and Anup Murarka, 1989
  917. GetFIleName, ¬© Apple Computer, 1989-1990
  918. ListOurFiles, ¬© Apple Computer, 1988-1990
  919. ListVol, ¬© Apple Computer, 1989-1990
  920. Mount, ¬© Landon Dyer, 1989
  921. ShowList, ¬© Gary Bond, 1989
  922. TinyPict, ¬© Apple Computer, 1988-1990
  923. UnMount, ¬© Landon Dyer, 1989
  924. (The original versions of DispPict, ListOurFiles, ListVol, and TinyPict
  925. were written by David Fry.)
  926.